openstack-dev vm 외부접속

horizon (=Dashboard)

1. 관리자

  • 네트워크

네트워크에 들어가면 기본적으로 2개의 네트워크가 생성되어있다.

  • fixed ip : vm에게 할당이 되는 ip (외부 접근 불가)
  • floating ip : vm에게 공인 ip처럼 할당

즉 vm은 fixed ip 를 가지고 이 ip와 mapping되는 floating ip 를 갖는다.

+) Network

  • Provider Network : floating ip를 서비스 해주는 Network
  • Self Service Network : fixed ip를 서비스 해주는 Network

기존에 생성되어있는 네트워크를 보면,

public은 기본적으로 172.24.4.0/24 즉 C class 대역으로 생성되어있고, 외부 접속이 가능하다.

실제로 ip addr 을 해서 br-ex (linux bridge external) 부분의 ip가 gateway( 172.24.4.1/24 )로 잡혀있고 이 ip로 ping을 날리면 ping도 동작한다.

즉 host안에서 가상으로 privider network를 만들어 놓은 상태이다. 물론 외부에서 접속할 수 없다.

2. 프로젝트

이 부분이 admin이라는 계정에서 사용할 수 있는 프로젝트이다.

Vm에 network 설정하기

할일 요약

  1. vm이 붙을 수 있는 가상 네트워크를 만듬
  2. vm과 가상네트워크 연결
  3. router에 public ip 연결 : 외부에서 접속하기 위하여 public ip를 붙여야하는데 그 ip를 붙이기위해 router를 사용

1. network 생성

  • 네트워크 토폴로지 확인 & 네트워크 생성 버튼 클릭
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/1.png
  • 네트워크 이름 생성
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/2.png
  • 서브넷 생성
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/3.png
  • 서브넷 세부정보
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/4.png
  • 생성 완료
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/5.png
  • 네트워크 편집
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/6.png
  • DHCP 설정 & 서브넷 변경
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/7.png

2. 인스턴스 생성

  • 인스턴스 시작
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/8.png
  • cirros 이미지 올리기
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/9.png
  • Flavor (알아서 설정하면 됨 - AWS 처럼!)
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/10.png
  • 위에서 생성한 network로 올리기
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/11.png
  • 키페어 생성
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/12.png
  • 키 복사
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/13.png

3. 라우터 생성

  • 라우터 이름 & 네트워크 ( public )
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/14.png
  • 라우터 인스턴스 추가
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/15.png
  • 생성한 라우터 추가
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/16.png

4. 인스턴스 하드 리부팅

https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/17.png

+) 인스턴스에 할당된 ip 확인

https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/18.png

5. 인스턴스 연결해보기

$ vagrant ssh : ubuntu 실행

$ sudo su - stack : stack 권한

$ ping instance-ip : 위에서 확인된 ip 로 ping을 날리면 연결이 되지 않음

$ ip netns : qdhcp 2개 qrouter 2개 > 생성한것 & 기존에 있던 것

$ sudo su : root 계정으로 (permission denied를 막기 위해)

$ ip netns exec qrouter-alsdfjasilfd /bin/bash : 위에서 확인한 qrouter 중 내가 생성한 router로 들어가면 namespace 안으로 들어가게됨 & namespace 안에서 bin/bash 실행

https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/19.png

6. namespace 안에서의 addr과 namespace 밖에서의 addr

$ ip addr 을 실행하면 namespace 안과 밖의 addr이 확연히 다르다는 것을 알 수 있다.

+) namespace 안에서 router의 gateway인 172.31.0.1/24 가 설정된 것을 볼 수 있다.

https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/20.png

7. instance ip로 ping을 날리면 날아가지 않는다.

왜냐하면 보안 그룹 에서 outbound는 열려있는데 inbound가 열려있지 않기 때문이다.

보안 그룹 > 규칙 관리

https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/22.png
  • 모든 ICMP : ping이 된다.
  • 모든 TCP : ssh 연결이 가능하다.
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/23.png

8. floating ip 할당하기

  • 유동 ip 할당
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/24.png
  • 유동 ip가 없기 때문에 + 를 눌러 ip 할당받아야함
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/25.png
  • pool: public > ip 할당
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/26.png
  • 유동 ip 할당
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/27.png
  • 할당 완료!
https://github.com/Tirrilee/TechTalk/blob/master/img/20180906_contributhon/28.png

9. 접속하기

접속할 때는 생성한 key를 이용해서 vim key.pem 을 생성하고

$ chmod 600 key.pem : 600 권한을 준다.

$ ssh -i key.pem cirros@유동-ip 를 하면 접속이 가능하다.

$ ssh -i key.pem cirros@instance에-할당된-ip 를 해도 접속이 가능하다.

+) 이후에 cirros가 아닌 ubuntu, centos 등 다양한 이미지를 올리고 싶을 때는 하드의 용량이 부족할 수 있다.

그때는 vm을 삭제하고, 용량을 변경할 수 있다. (Vagrant Size 변경하기)

알아야할 지식

  • 리눅스 브릿지

: 호스트의 가상 네트워크 인터페이스를 다리 삼아 외부와 연결한다.

https://github.com/Tirrilee/TechTalk/blob/master/img/%EB%A6%AC%EB%88%85%EC%8A%A4%20%EA%B0%80%EC%83%81%20%EC%8B%9C%EC%8A%A4%ED%85%9C%20%EB%9D%BC%EC%9A%B0%EB%93%9C%20%EC%97%B0%EA%B2%B0.jpg

게스트와 통신하는 브리지 네트워크 인터페이스는 virbr0이고

vnet1, vnet2는 게스트가 사용하는 가상네트워크 인터페이스로 게스트 내부의 네트워크 인터페이스 eth0에 대응한다.

+) eth란 물리적인 장비에 네트워크 인터페이스 카드에 대해서 드라이버가 잡힌 곳이다. 리눅스가 이걸 사용하는 방법이 여러가지인데, 그 중에 하나가 eth0:1 eth0:2 처럼 하나의 eth0에 대해서 여러 가상 인스턴스를 받을 수 있다.

  • Iptables

: 리눅스에 있는 방화벽, 포트포워딩 등을 설정 가능한 곳이다.

  • Routing

: 어떤 ip대역에서 어떤 packet 이 왔을 때 어떤 장비로 갈지 결정하는 것이다.

  • Namespace

: vm에서는 각 머신별로 독립적인 공간을 제공하고 서로가 충돌하지 않도록 하는 기능을 가지고 있는데,

리눅스에서는 이와 동일한 역할을 하는 namespace 기능을 kernel에 내장하고 있다.

네임스페이스내에서는 peer라는 게 있어서 네임스페이스끼리 연결 가능하다.

+) 추가

  • IP 범위
    • 사설IP 범위
      • A class 1개 : 10.0.0.0 - 10.255.255.255 (8 bit prefix)
      • B class 16개 : 172.16.0.0 - 172.31.255.255 (12 bit prefix)
      • C class 256개 : 192.168.0.0 - 192.168.255.255 (16 bit prefix)
    • 공인IP 범위
      • Class A : 1 ~ 126 (각각 16M개의 호스트)
      • Class B : 128 ~ 191 (각각 65,536개의 호스트)
      • Class C : 192 ~ 223 (각각 356개의 호스트)
      • Class D : 224 ~ 239 (멀티캐스트 모드)
      • Class E : 240 ~ 255 (나중의 위해 예약되었음)
      • 127.0.0.1 은로컬 커퓨터가 자기자신을 표현하는 루프백 주소이다.
  • DHCP
    • 네트워크 안에 컴퓨터에 자동으로 네임 서버 주소, IP주소, 게이트웨이 주소를 할당해주는 것을 의미하고, 해당 클라이언트에게 일정 기간 임대를 하는 동적 주소 할당 프로토콜이다.
    • DHCP서버 는 ip 주소를 가지고 있는 서버에서 실행되는 프로그램으로 일정한 범위의 ip주소를 다른 클라이언트에게 할당하여 자동으로 설정하게한다.
    • DHCP 클라이언트 는 시스템이 시작되면 DHCP 서버에 자신의 시스템 ip 주소를 요청하여 주소를 부여받으면 TCP/IP가 초기화되고, 다른 host와 TCP/IP를 이용해 통신할 수 있다.
  • 네임 서버
    • 도메인에 할당하는 ip를 알려주는 서비스
    • name server가 죽으면 ip로는 접근이 가능하지만 domain으로는 접근 불가능
  • ICMP
    • ICMP는 TCP/IP에서 IP 패킷을 처리할 때 발생되는 문제를 알려주는 프로토콜 이다.
    • IP에는 오로지 패킷을 목적지에 도달 시키기 위한 내용들로만 구성되어 있다. 만일 정상적으로 패킷이 목적지에 도달하지 않았을 때, 이에 관련된 에러 처리를 진행해야하는데 IP에는 그러한 에러 처리법이 있지 않다. 따라서 ip의 이러한 단점을 위해 ICMP가 존재한다.
    • ICMP는 에러상황이 발생할 경우 IP헤더에 기록되어 있는 출발지 호스트로 이러한 에러에 대한 상황을 보내주는 역할을 수행 하게 된다.
  • 하이퍼바이저
    • 호스트 컴퓨터 1대에서 다수의 운영체제를 동시에 실행할 수 있도록 해주는 가상 플랫폼 기술이고 가상 머신 모니터라고도 부른다.
    • 높은 수준의 관리 모니터링 도구에 대한 인터페이스 뿐만 아니라 OS 간 방해를 막기 위해 vm에 대한 자원 및 메모리 할당 등을 처리한다.
  • gateway
    • 현재 사용자가 위치한 네트워크에서 다른 네트워크로 이동하기 위해 반드시 거쳐야하는 거점